#ifdef	__cplusplus
extern "C" {
#endif

#define LISTBOX_SUCCESS 0
#define LISTBOX_FAILURE -1
#define LISTBOX_FIRST_PAGE -2
#define LISTBOX_LAST_PAGE -3

#define LISTBOX_MAX_NUMBER 50 // Numero maximo de listboxes que podem ser criados.

#define DEPTH_OFFSET 0x40 // Diferenca na cor dos elementos selecionados do listbox.
#define ELEMENT_SPACE 6 // Espacamento entre cada elemento do listbox.

    /**
     * @brief Cria um listbox.
     * @param int x                     Posicao x do listbox criado.
     * @param int y                     Posicao y do listbox criado.
     * @param int width                 Largura do listbox.
     * @param int height                Altura do listbox.
     * @param int r                     Cor do listbox em RGB.
     * @param int g                     Cor do listbox em RGB.
     * @param int b                     Cor do listbox em RGB.
     * @param unsigned char border      Tamanho da borda do listbox em pixels.
     * @param unsigned char font_height Tamanho da fonte dos elementos do listbox em pixels.
     * @param int font_r                Cor da fonte do listbox em RGB.
     * @param int font_g                Cor da fonte do listbox em RGB.
     * @param int font_b                Cor da fonte do listbox em RGB.
     * @return int                      Retorna o id do listbox criado ou LISTBOX_FAILURE em caso de falha.
     */
    extern signed int listbox_create(unsigned int x, unsigned int y, unsigned int width,
            unsigned int height, unsigned int r, unsigned int g, unsigned int b,
            unsigned char border, unsigned char font_height, unsigned int font_r,
            unsigned int font_g, unsigned int font_b);

    extern signed int listbox_destroy(signed int listboxId);

    /**
     * @brief Exibe o listbox.
     * @param int listboxId             Id do listbox.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_draw(signed int listboxId);

    /**
     * @brief Obtem a situacao atual do listbox (selecionado ou nao).
     * @param int listboxId             Id do listbox.
     * @return int                      Retorna true (1) para selecionado ou false (0) para deselecionado.
     */
    extern signed int listbox_read(signed int lstboxId);

    /**
     * @brief Adiciona um elemento ao listbox.
     * @param int listboxId             Id do listbox.
     * @param char *elementText         Texto do novo elemento.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_addElement(signed int listboxId, unsigned char *elementText, unsigned int elementIndex);

    extern signed int listbox_removeElement(signed int listboxId, unsigned int elementIndex);

    /**
     * @brief Seleciona o proximo elemento do listbox.
     * @param int listboxId             Id do listbox.
     * @return int                      Retorna o id do novo elemento selecionado ou LISTBOX_FAILURE em caso de falha.
     */
    extern signed int listbox_nextElement(signed int listboxId);

    /**
     * @brief Seleciona o elemento anterior do listbox.
     * @param int listboxId             Id do listbox.
     * @return int                      Retorna o id do novo elemento selecionado ou LISTBOX_FAILURE em caso de falha.
     */
    extern signed int listbox_previousElement(signed int listboxId);
    
    /**
     * @brief Passa para a proxima pagina do listbox.
     * @param int listboxId             Id do listbox.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_nextPage(signed int listboxId);

    /**
     * @brief Passa para a pagina anterior do listbox.
     * @param int listboxId             Id do listbox.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_previousPage(signed int listboxId);

    /**
     * @brief Seleciona um elemento do listbox.
     * @param int listboxId             Id do listbox.
     * @param int elementId             Id do elemento a ser selecionado.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_selectElement(signed int listboxId, signed int elementId);

    /**
     * @brief Deseleciona um elemento do listbox.
     * @param int listboxId             Id do listbox.
     * @param int elementId             Id do elemento a ser deselecionado.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_unselectElement(signed int listboxId);

    /**
     * @brief Retorna o texto do elemento.
     * @param int listboxId             Id do listbox.
     * @param int elementId             Id do elemento.
     * @param char *text                Variavel que vai receber uma copia do texto.
     * @return *char                    Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */    
    extern signed int listbox_getTextElement(signed int listboxId, signed int elementId, unsigned char *text);
    
    /**
     * @brief Obtem o id do elemento atual selecionado.
     * @brief int listboxId             Id do listbox.
     * @return int                      Retorna o id do elemento selecionado. Em caso de falha ou se nenhum elemento esta selecionado LISTBOX_FAILURE.
     */
    extern signed int listbox_getActualElementId(signed int listboxId);

    /**
     * @brief Seta a borda do listbox.
     * @param int listboxId             Id do listbox.
     * @param int border                Tamanho da borda em pixels.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_setBorder(signed int listboxId, unsigned int border);

    /**
     * @brief Seta a cor do listbox.
     * @param int listboxId             Id do listbox.
     * @param int r                     Cor do listbox em RGB.
     * @param int g                     Cor do listbox em RGB.
     * @param int b                     Cor do listbox em RGB.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_setColor(signed int listboxId, unsigned int r, unsigned int g, unsigned int b);

    /**
     * @brief Seta a cor do elemento selecionado do listbox.
     * @param int r                     Cor do elemento selecionado em RGB.
     * @param int g                     Cor do elemento selecionado em RGB.
     * @param int b                     Cor do elemento selecionado em RGB.
     * @return int                      Retorna LISTBOX_SUCCESS ou LISTBOX_FAILURE.
     */
    extern signed int listbox_setColor_selectedElement(signed int listboxId, unsigned int r, unsigned int g, unsigned int b);

    extern signed int listbox_getNumberElements(signed int listboxId);

    extern signed int listbox_setTextElement(signed int listboxId, unsigned int elementId, unsigned char *text);

#ifdef	__cplusplus
}
#endif
